//package com.ruoyi.web.controller.hazard;
//
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.ruoyi.common.core.domain.R;
//import com.ruoyi.common.enums.WhetherEnum;
//import com.ruoyi.common.utils.SecurityUtils;
//import com.ruoyi.common.utils.StringUtils;
//import com.ruoyi.file.domain.FileInfo;
//import com.ruoyi.file.service.impl.FileInfoServiceImpl;
//import com.ruoyi.hazard.domain.HazardInfo;
//import com.ruoyi.hazard.domain.HazardTrackInfo;
//import com.ruoyi.hazard.domain.vo.HazardTrackInfoVo;
//import com.ruoyi.hazard.service.HazardInfoService;
//import com.ruoyi.hazard.service.HazardTrackInfoService;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiImplicitParam;
//import io.swagger.annotations.ApiOperation;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.security.access.prepost.PreAuthorize;
//import org.springframework.util.CollectionUtils;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.*;
//
//import javax.annotation.Resource;
//import java.util.*;
//import java.util.stream.Collectors;
//
//@Api(tags="隐患追踪管理")
//@Slf4j
//@RestController
//@RequestMapping("/track")
//public class TrackController {
//    @Resource
//    private HazardInfoService hazardInfoService;
//    @Resource
//    private HazardTrackInfoService hazardTrackInfoService;
//    @Resource
//    private FileInfoServiceImpl fileInfoService;
//
//    @PreAuthorize("@ss.hasPermi('track:list')")
//    @ApiOperation("隐患追踪列表")
//    @GetMapping("/getHazardTrackList/{hazardId}")
//    @ApiImplicitParam(name = "hazardId", value = "隐患信息主键", required = true, dataType = "long", paramType = "path", dataTypeClass = Long.class)
//    public R<List<HazardTrackInfoVo>> listHazardTrack(@PathVariable Long hazardId) {
//        List<HazardTrackInfoVo> hazardTracks = Optional.ofNullable(hazardTrackInfoService.list(new LambdaQueryWrapper<HazardTrackInfo>().eq(HazardTrackInfo::getHazardId, hazardId)))
//                .orElse(Collections.emptyList())
//                .stream()
//                .map(hazardTrackInfo -> {
//                    try {
//                        return hazardTrackInfoService.toVo(hazardTrackInfo);
//                    } catch (Exception e) {
//                        // 记录异常日志，根据业务需求决定是否抛出异常或返回默认值
//                        log.error("转换HazardTrackInfo到VO时发生异常", e);
//                        return null;
//                    }
//                })
//                .filter(Objects::nonNull)
//                .collect(Collectors.toList());
//        return R.ok(hazardTracks);
//    }
//
//    @PreAuthorize("@ss.hasPermi('track:add')")
//    @ApiOperation("新增隐患追踪")
//    @PostMapping("/addHazardTrack")
//    public R<HazardTrackInfoVo> add(@Validated @RequestBody HazardTrackInfoVo hazardTrackInfoVo) {
//        if(hazardTrackInfoVo == null) {
//            return R.fail("参数不能为空");
//        }
//        if(hazardTrackInfoVo.getHazardId() == null) {
//            return R.fail("隐患信息不能为空");
//        }
//        HazardInfo hazardInfo = hazardInfoService.getById(hazardTrackInfoVo.getHazardId());
//        if(hazardInfo == null) {
//            return R.fail("隐患不存在");
//        }
//        if (!StringUtils.inStringIgnoreCase(hazardInfo.getStatus(), "new", "auditing", "rejected")) {
//            return R.fail("该隐患不允许修改");
//        }
//        if(hazardInfo.getHangup()) {
//            return R.fail("隐患已挂起，暂时不需要跟踪");
//        }
//        HazardTrackInfo hazardTrackInfo = hazardTrackInfoService.toEntity(hazardTrackInfoVo);
//        hazardInfo.setStatus("auditing");
//        boolean result = hazardTrackInfoService.save(hazardTrackInfo) && hazardInfoService.updateById(hazardInfo);
//        if (!result) {
//            return R.fail("新增失败");
//        }
//        hazardTrackInfoVo.setId(hazardTrackInfo.getId());
//        return R.ok();
//    }
//
//    @PreAuthorize("@ss.hasPermi('track:update')")
//    @ApiOperation("修改隐患追踪")
//    @PutMapping("/editHazardTrack")
//    public R<HazardTrackInfoVo> update(@Validated @RequestBody HazardTrackInfoVo hazardTrackInfoVo) {
//        if(hazardTrackInfoVo == null) {
//            return R.fail("参数不能为空");
//        }
//        if(hazardTrackInfoVo.getId() == null) {
//            return R.fail("跟踪不能为空");
//        }
//        HazardTrackInfo hazardTrackInfo = hazardTrackInfoService.getById(hazardTrackInfoVo.getId());
//        if(hazardTrackInfo == null) {
//            return R.fail("隐患追踪不存在");
//        }
//        if(hazardTrackInfo.getApproved()!=null){
//            return R.fail("隐患追踪已审核，不允许修改");
//        }
//
//        HazardInfo hazardInfo = hazardInfoService.getById(hazardTrackInfoVo.getHazardId());
//        if(hazardInfo == null) {
//            return R.fail("该隐患不存在");
//        }
//        if(hazardInfo.getHangup()) {
//            return R.fail("隐患已挂起，暂时不需要跟踪");
//        }
//        hazardTrackInfo = hazardTrackInfoService.toEntity(hazardTrackInfoVo);
//        boolean result = hazardTrackInfoService.updateById(hazardTrackInfo);
//        if (!result) {
//            return R.fail("修改隐患追踪失败");
//        }
//        hazardTrackInfoVo = hazardTrackInfoService.toVo(hazardTrackInfo);
//        return R.ok(hazardTrackInfoVo);
//
//    }
//
//    @ApiOperation("删除隐患整改跟踪")
//    @PreAuthorize("@ss.hasPermi('track:delete')")
//    @DeleteMapping("/deleteHazardTrack/{id}")
//    @ApiImplicitParam(name = "id", value = "隐患跟踪主键", required = true, dataType = "long", paramType = "path", dataTypeClass = Long.class)
//    public R<Void> delete(@PathVariable Long id) {
//        HazardTrackInfo hazardTrackInfo = hazardTrackInfoService.getById(id);
//        if(hazardTrackInfo == null){
//            return R.fail("隐患信息不存在");
//        }
//
//        if(hazardTrackInfo.getApproved()!=null){
//            return R.fail("隐患追踪已审核，不允许删除");
//        }
//        // 将hazardTrackInfo转换为VO对象
//        HazardTrackInfoVo hzardTrackInfoVo = hazardTrackInfoService.toVo(hazardTrackInfo);
//
//        // 查询相同隐患ID的所有跟踪记录
//        List<HazardTrackInfo> hazardTracks = hazardTrackInfoService.list(new LambdaQueryWrapper<HazardTrackInfo>().eq(HazardTrackInfo::getHazardId, hzardTrackInfoVo.getHazardId()));
//
//        // 如果没有其他跟踪记录，将对应的隐患信息状态更新为"new"
//        if(CollectionUtils.isEmpty(hazardTracks)){
//            HazardInfo dbHazardInfo = hazardInfoService.getById(hzardTrackInfoVo.getHazardId());
//            dbHazardInfo.setStatus("new");
//            hazardInfoService.updateById(dbHazardInfo);
//        }
//        // 删除关联的附件文件
//        fileInfoService.deleteFiles(hzardTrackInfoVo.getAttachments().stream().map(FileInfo::getId).collect(Collectors.toList()));
//        // 删除当前跟踪记录
//        hazardTrackInfoService.removeById(id);
//
//        return R.ok();
//    }
//    @ApiOperation("通过审核")
//    @PreAuthorize("@ss.hasPermi('track:approved')")
//    @PutMapping("/approvedHazardTrack")
//    public R<Void> approved(@Validated @RequestBody HazardTrackInfoVo hazardTrackInfoVo) {
//        if(hazardTrackInfoVo == null) {
//            return R.fail("参数不能为空");
//        }
//        if(hazardTrackInfoVo.getId() == null) {
//            return R.fail("跟踪不能为空");
//        }
//        HazardTrackInfo hazardTrackInfo = hazardTrackInfoService.getById(hazardTrackInfoVo.getId());
//        if(hazardTrackInfo == null) {
//            return R.fail("隐患追踪不存在");
//        }
//        if(hazardTrackInfo.getApproved()!=null){
//            return R.fail("隐患追踪已审核，不允许修改");
//        }
//        HazardInfo hazardInfo = hazardInfoService.getById(hazardTrackInfoVo.getHazardId());
//        if(hazardInfo == null) {
//            return R.fail("该隐患不存在");
//        }
//        if(hazardInfo.getStatus().equals("approved")) {
//            return R.fail("该隐患已审核通过，不允许修改");
//        }
//        if(hazardInfo.getHangup()) {
//            return R.fail("隐患已挂起，暂时不需要跟踪");
//        }
//        hazardTrackInfo.setAuditBy(SecurityUtils.getUsername());
//        hazardTrackInfo.setAuditTime(new Date());
//        hazardTrackInfo.setApproved(WhetherEnum.YES.getCode());
//        hazardTrackInfo.setAuditRemark(hazardTrackInfoVo.getAuditRemark());
//        hazardInfo.setStatus("approved");
//        boolean result = hazardTrackInfoService.updateById(hazardTrackInfo) && hazardInfoService.updateById(hazardInfo);
//        if (!result) {
//            return R.fail("通过审核提交失败");
//        }
//        return R.ok();
//    }
//    @ApiOperation("驳回审核")
//    @PreAuthorize("@ss.hasPermi('track:rejected')")
//    @PutMapping("/rejectedHazardTrack")
//    public R<Void> rejected(@Validated @RequestBody HazardTrackInfoVo hazardTrackInfoVo) {
//        if(hazardTrackInfoVo == null) {
//            return R.fail("参数不能为空");
//        }
//        if(hazardTrackInfoVo.getId() == null) {
//            return R.fail("跟踪不能为空");
//        }
//        HazardTrackInfo hazardTrackInfo = hazardTrackInfoService.getById(hazardTrackInfoVo.getId());
//        if(hazardTrackInfo == null) {
//            return R.fail("隐患追踪不存在");
//        }
//        if(hazardTrackInfo.getApproved()!=null){
//            return R.fail("隐患追踪已审核，不允许修改");
//        }
//        HazardInfo hazardInfo = hazardInfoService.getById(hazardTrackInfoVo.getHazardId());
//        if(hazardInfo == null) {
//            return R.fail("该隐患不存在");
//        }
//        if(hazardInfo.getHangup()) {
//            return R.fail("隐患已挂起，暂时不需要跟踪");
//        }
//        hazardTrackInfo.setAuditBy(SecurityUtils.getUsername());
//        hazardTrackInfo.setAuditTime(new Date());
//        hazardTrackInfo.setApproved(WhetherEnum.NO.getCode());
//        hazardTrackInfo.setAuditRemark(hazardTrackInfoVo.getAuditRemark());
//        hazardInfo.setStatus("rejected");
//        boolean result = hazardTrackInfoService.updateById(hazardTrackInfo) && hazardInfoService.updateById(hazardInfo);
//        if (!result) {
//            return R.fail("驳回审核提交失败");
//        }
//        return R.ok();
//    }
//}
